package com.qq.dao;

import com.qq.data.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;
import java.util.Date;
import java.util.List;

@Repository
public interface UserDao extends JpaRepository<User,Integer> {

    //查询数量
    long countByArea(int area);
    User getByQq(int qq);

    //save和saveAndFlush 都支持插入和更新
    // save不会立刻提交到数据库，可能只是修改在内存中的；saveAndFlush则立刻提交生效
    //实体包含主键时执行更新，没有被赋值的字段会被null覆盖，所以一般是先获取数据库对象再修改保存，要么就自定义sql
    @Override
    User saveAndFlush(User user);

    //通过指定字段内容查找，可连接AND、OR、LIKE、IS等
    //实体属性不加@Column时，数据库字段user_name  必须使用驼峰命名userName
    List<User> getByUserName(String s);

    //输入字段必须与实体中定义类型保持一致
    List<User> getByCreateTimeAfter(Date s);

    //在执行update或者delete方法时，必须加上注解@Modifying 和 @Transactional。
    @Transactional
    @Modifying
    @Query("update User set password=:password where qq=:qq ")
    Integer updateUserPassword(@Param("qq") int qq, @Param("password") String password);

    //分页排序
    //like语句传参手动加%    pageable的page从0开始
    Page<User> getByUserNameLike(String username, Pageable pageable);
    List<User> getByUserNameLike(String username, Sort sort);
}